package com.smh.demo1.a10;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;

/**
 * @author shiminghui
 * @date 2025/4/12 16:30
 * @description: TODO
 */
public class CglibProxyDemo {
    /**
     * cglib代理,代理对象和目标对象是父子关系
     * 目标对象是代理对象的父类(所以父类不能是final(会报错),方法也不能是final(不会报错))
     * 代理对象会代理父类的所有方法
     */

    private static final Logger log = LoggerFactory.getLogger(CglibProxyDemo.class);

    public static void main(String[] args) {

        Target target = new Target();

        Target proxyTarget = (Target) Enhancer.create(Target.class, (MethodInterceptor) (proxy, method, objects, methodProxy) -> {
            log.info("before.....");
            Object result = method.invoke(target, objects); // 反射调用
            Object invoke = methodProxy.invoke(target, objects); // 没有使用反射机制,需要目标(spring 用的是这种)
            Object invokeSuper = methodProxy.invokeSuper(proxy, objects); // 没有使用反射,不需要目标,需要代理
            log.info("after.....");
            return result;
        });

        proxyTarget.test();
    }

    static class Target {
        public void test() {
            System.out.println("target test");
        }
    }


}
